GitLAB&Jenkins
GitLAB &Jenkins
目录
[toc]
实践:基于Jenkins提交流水线(测试成功)-2023.4.25
目的:掌握通过触发器将GitLab和Jenkins集成,实现提交流水线。
1、触发Jenkins构建
安装Generic Webhook Trigger
插件
重启后,进入一个Pipeline项目设置,已经可以选择这个触发器了....
可以看到,也是能构建成功的。
解析GET/POST请求数据
传参注意,第一个参数使用?号连接, 后面的参数使用&符号连接。
?token=demo-pipeline-service&user=jenkins&a=1&b=2
解析GET数据
- 客户端发送Get请求, 带有两个参数
version
和username
。
http:println("${version}")println("${username}")pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'}}}}
再次postman触发,观察效果:(符合预期)
解析HEADER参数数据
- 客户端发送请求(什么请求都可以,这里的header与请求类型无关), 带有两个参数 devops和 tool-name。
- Jenkins 配置Generic hook,获取请求参数devops和 tool-name 。
- 通过jenkinsfile读取传递的参数
注意,这里的pipeline代码如果打印tool-name
变量的话,会报错的
这里要使用下划线来替换横杠:
再次触发,就正常了,符合预期。
解析POST数据
- 客户端发送POST请求, 参数存储在body体中(参考POSTMAN中的样例)
- Jenkins 配置触发器来获取Post参数。
删除之前测试的header参数,request参数。
$
代表/,获取所有数据
获取name字段
- Jenkinsfile中使用参数
触发:
验证:
扩展流水线解析JSON数据
- 安装插件:
Pipeline Utility Steps
- readJSON: 处理json数据
currentBuild.displayName ="${name}"println("${Data}")NewData=readJSON text:"${Data}"envName =NewData["envName"]appsName =NewData["apps"]["name"]pipeline {agent anystages {stage('Hello') {steps {script {println("${envName}")println("${appsName}")}}}}}
再次构建:
验证:(符合预期)
Rebuilder
插件使用
可以直接携带原触发参数进行触发,不用重复触发(不用在重复的提交代码了)。
进入某一次构建后,可以点击rebuild。
2、获取触发参数
1.触发器配置
Jenkins开启trigger
目的: 开启trigger后,就可以实现其他系统通过一个指定的URL进行自动触发构建了;
新建一个文件夹存放对应GitLab仓库组中的流水线。这里建议用仓库组的名称作为文件夹的名称devops03
;
用Gitlab项目名称与流水线命名; devops03-demo-service
项目;
- 开启Generic webhook;
- 配置触发Token,例如:作业名称
devops03-demo-service
(这个token是流水线触发需要传递的); - 生成的触发URL;
http:NewData=readJSON text:"${Data}"println("${NewData}")pipeline {agent anystages {stage('Hello') {steps {script {println("${NewData}")}}}}}
配置GitLab WebHook
进入GitLab项目设置, 进入 webhook
配置页面;
配置要触发的URL,即Jenkins触发器接口URL;
选择发生哪种GitLab事件后触发此Webhook;例如:Push提交代码、Tag创建标签等等;
在gitlab的项目里配置好webhook
http:NewData=readJSON text:"${Data}"println("${NewData}")srcUrl =NewData["project"]["git_http_url"]branchName =NewData["ref"] -"refs/heads/"currentBuild.displayName ="${branchName}"currentBuild.description ="src:${srcUrl}"pipeline {agent anystages {stage('CheckOut') {steps {script {println("Checkout:${srcUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${srcUrl}"]]])sh 'ls -l'}}}}}
将写好的代码保存到jekins里。
- 在gitlab任意分支做个提交:
我们先拉取下代码:
在feature-dev-01
编辑README.md文件并推送。
Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$catREADME.md情出自愿-事过无悔Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$echo佳>>README.mdWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitadd.warning:intheworkingcopyof'README.md',LFwillbereplacedbyCRLFthenexttimeGittouchesitWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitcommit-m"佳"[feature-dev-01 683b378] 佳1filechanged,1insertion(+)Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitpushoriginfeature-dev-01Enumeratingobjects:5,done.Countingobjects:100%(5/5),done.Deltacompressionusingupto8threadsCompressingobjects:100%(2/2),done.Writingobjects:100%(3/3),287 bytes |287.00KiB/s,done.Total3(delta 1),reused 0 (delta0),pack-reused 0remote:remote:Tocreateamergerequestforfeature-dev-01,visit:remote:http:remote:Tohttp:7cf5639..683b378feature-dev-01->feature-dev-01Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$
- 此时可以看到jenkins里的流水线被触发了
- 这里再在新建一个分支,用于测试,看是否会触发jebnkins流水线
Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitcheckout-bfeature-003Switchedtoanewbranch'feature-003'Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$lsHELP.mdREADME.mdmvnw*mvnw.cmdpom.xmlsrc/Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$echo"i am very hurt">README.mdWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$gitadd.warning:intheworkingcopyof'README.md',LFwillbereplacedbyCRLFthenexttimeGittouchesitWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$gitcommit-m"hurt"[feature-003 1de466b] hurt1filechanged,1insertion(+),2deletions(-)Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$gitpushoriginfeature-003Enumeratingobjects:5,done.Countingobjects:100%(5/5),done.Deltacompressionusingupto8threadsCompressingobjects:100%(2/2),done.Writingobjects:100%(3/3),262 bytes |262.00KiB/s,done.Total3(delta 1),reused 0 (delta0),pack-reused 0remote:remote:Tocreateamergerequestforfeature-003,visit:remote:http:remote:Tohttp:*[new branch]feature-003->feature-003Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$
可以看到,jenkins流水线被触发了。
🍀 之前代码
webhookData =readJSON text:"${webhook_data}"env.branchName =webhookData["ref"] -"refs/heads/"env.projectUrl =webhookData["project"]["git_http_url"]env.userEmail =webhookData["user_email"]currentBuild.description ="BranchName:${env.branchName}"currentBuild.displayName ="${env.branchName}"pipeline {agent {label "build01"}stages {stage('Checkout') {steps {script{checkout([$class:'GitSCM',branches:[[name:"${env.branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'d7e4e500-e5c6-4673-ae4b-d43bf4ff5d19',url:"${env.projectUrl}"]]])}}}stage('Build'){steps{script{sh "mvn clean package -DskipTests"}}}stage('test'){steps{script{sh "mvn test"}}}}post {always{script{EmailUser("${env.userEmail}",currentBuild.currentResult)}}}}defEmailUser(userEmail,status){emailext body:"""<!DOCTYPE html><html><head><meta charset="UTF-8"></head> <body leftmargin="8"marginwidth="0"topmargin="8"marginheight="4"offset="0"><img src="http:<table width="95%"cellpadding="0"cellspacing="0"style="font-size:11pt;font-family:Tahoma,Arial,Helvetica,sans-serif"><tr><td><br /><b><font color="#0B610B">构建信息</font></b></td> </tr> <tr><td><ul><li>项目名称:${JOB_NAME}</li> <li>构建编号:${BUILD_ID}</li> <li>构建状态:${status} </li> <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li><li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li></ul> </td> </tr> <tr></table> </body> </html> """,subject:"Jenkins-${JOB_NAME}项目构建信息 ",to:userEmail}
- 进一步更新代码
此时,想要commitId的前8位该如何取呢?
这样处理就好:
println("${Data}")NewData=readJSON text:"${Data}"println("${NewData}")srcUrl =NewData["project"]["git_http_url"]branchName =NewData["ref"] -"refs/heads/"env.commitId =NewData["checkout_sha"][0..7]currentBuild.displayName ="${branchName}:${env.commitId}"currentBuild.description ="src:${srcUrl}"pipeline {agent anystages {stage('CheckOut') {steps {script {println("Checkout:${srcUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${srcUrl}"]]])sh 'ls -l'}}}}}
触发测试:(符合预期)
4、手动触发流水线
很简单的,就是在jenkins项目里添加一些选项参数,把这些变量写死在选项参数里就好。
自动触发和手动触发的可以并存的,例如写一些If ……else,但是不推荐。
手动触发:例如有一些版本分支,这些分支名是会变的,因此不是很方便;但是如果不想每次提交都触发流水线,而是等到一个小版本后再触发,这个用手动触发也是可以的哦。
currentBuild.description ="BranchName:${env.branchName}"currentBuild.displayName ="${env.branchName}"pipeline {agent {label "build01"}stages {stage('Checkout') {steps {script{checkout([$class:'GitSCM',branches:[[name:"${env.branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'d7e4e500-e5c6-4673-ae4b-d43bf4ff5d19',url:"${env.projectUrl}"]]])}}}stage('Build'){steps{script{sh "mvn clean package -DskipTests"}}}stage('test'){steps{script{sh "mvn test"}}}}}
这里做下测试:
- jenkins上创建项目
gitlab-jenkins-service-manual
,配置好选项参数。
- 编写pipeline代码
currentBuild.description ="BranchName:${env.branchName}"currentBuild.displayName ="${env.branchName}"pipeline {agent {label "build01"}stages {stage('CheckOut') {steps {script {println("Checkout:${projectUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${projectUrl}"]]])sh 'ls -l'}}} stage('Build'){steps{script{println("mvn clean package -DskipTests") }}}stage('test'){steps{script{println("mvn test")}}}}}
- 准备好一个gitlab项目就好。
- 测试(符合预期)
5、Jenkins消息通知
添加邮箱
邮箱是标配吧。(钉钉机器人也是可以的)
- 默认情况可能每个Gitlab用户没有配置邮箱的, 需要Gitlab用户要配置好邮箱。
- 点击头像进入 edit profile
添加自己邮箱:
这里需要登录到自己的邮箱去确认下:
方法1:或者按如下方式直接配置好自己的gitlab邮箱为qq邮箱:(强制更改) 本次是强制更改的。
点击Edit
:
这里配置好自己的邮箱,点击保存:
可以看到这里的邮箱被确认了:
方法2:在自己的邮箱里确认。
- 奇怪,我这里怎么163、qq邮箱都收不到确认邮件呢??😥
- 经过百度,发现是在gitlab里的配置文件要做下配置的:
[root@devops ~]#docker psCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES11a54a1f4a2agitlab/gitlab-ce:14.9.3-ce.0"/assets/wrapper"6daysagoUp28hours(healthy) 0.0.0.0:80->80/tcp,0.0.0.0:443->443/tcp,0.0.0.0:2222->22/tcp devops_tutorial_gitlabf3f039aa667ajenkins/jenkins:2.332.2-centos7-jdk8"/sbin/tini -- /usr/…"4weeksagoUp24hours0.0.0.0:8080->8080/tcp,:::8080->8080/tcp,0.0.0.0:50000->50000/tcp,:::50000->50000/tcpjenkins[root@devops ~]#docker exec -it devops_tutorial_gitlab bashroot@11a54a1f4a2a:/#vi/etc/gitlab/gitlab.rb#搜索smtpgitlab_rails['smtp_enable']=truegitlab_rails['smtp_address']="smtp.163.com"gitlab_rails['smtp_port']=465gitlab_rails['smtp_user_name']="onexlforyou@163.com"gitlab_rails['smtp_password']="NVSMOUfffAxxxccEMXAB"gitlab_rails['smtp_domain']="163.com"gitlab_rails['smtp_authentication']="login"gitlab_rails['smtp_enable_starttls_auto']=truegitlab_rails['smtp_tls']=truegitlab_rails['gitlab_email_from']='onexlforyou@163.com'root@11a54a1f4a2a:/#gitlab-ctlreconfigure
- 此时,发下就可以正常识别到自己的邮箱了:
- 参考链接: